#include <stdio.h>

//using  namespace std;

class AbstractTest {

    /**
    纯虚函数, 相当于 Java 的抽象类.
    1.纯虚函数没有函数体。
    2.最后面的“=0”并不表示函数返回值为0，它只起形式上的作用。
    3.纯虚函数只有函数的名字而不具备函数的功能，不能被调用。
    4.纯虚函数的作用是在基类中为其派生类保留一个函数的名字，以便派生类根据需要对他进行定义。
      如果在基类中没有保留函数名字，则无法实现多态性。
    5.如果在一个类中声明了纯虚函数，在其派生类中没有对其函数进行定义，则该虚函数在派生类中仍然为纯虚函数。
    */
    virtual void Display() = 0; // 纯虚函数

public:
    void getabc();
} /*abstractTest 不允许创建对象, 因为是抽象类*/;


class Parent {
public:
    char data[20];
    void Function1();
    virtual void Function2();   // 虚函数

} parent;

void Parent::Function1() {
    printf("父类, 方法1\n");
}

void Parent::Function2() {
    printf("父类, 方法2, virtual方法\n");
}


class Child : public Parent {
    void Function1();
    void Function2();

} child;

void Child::Function1() {
    printf("子类, 方法1\n");
}

void Child::Function2() {
    printf("子类, 方法2, 父类是virtual方法\n");
}


/*
 * pChild 输出:
 *		父类, 方法1		<--- 这一行感觉非常不科学...
 *		子类, 方法2
 *
 * pParent 输出:
 *		父类, 方法1
 *		父类, 方法2
 */
int main222(int argc, char *argv[]) {
    Parent *pChild = &child;    // 指向子类对象
    Parent *pParent = &parent;    // 指向基类对象

    printf("1.调用子类的方法:\n");
    //键盘按 pChild.F..  就会自动转换 ->
    pChild->Function1();
    pChild->Function2();
    printf("2.调用父类的方法:\n");
    pParent->Function1();
    pParent->Function2();
    return 0;
}
